#include "thread_pool.h"
uint16_t __checksum(task tsk)
{
    size_t chk_sum = __get_task_check_sum(tsk);
    DEBUG_PRINT("checksum: chk_cum %ld", chk_sum);
    return (uint16_t)(~chk_sum);
}

int __verify_checksum(task tsk, uint16_t chk_sum)
{
    int err = -1;
    if ((__get_task_check_sum(tsk) | chk_sum) == 0xffff)
    {
        return 0;
    };
    return err;
}
static size_t __get_task_check_sum(task tsk)
{
    DEBUG_PRINT("get_task_check_sum: tsk %ld", (size_t)tsk);
    size_t tsk_data = (size_t)tsk;
    uint16_t *ptr = (uint16_t *)(&tsk_data);
    size_t chk_sum = 0;
    for (int i = 0; i < (sizeof(size_t) / sizeof(uint16_t)); i++)
    {
        /* code */
        chk_sum += ptr[i];
    }
    chk_sum = (chk_sum >> 16) + (chk_sum & 0xffff);
    chk_sum = (chk_sum >> 16) + (chk_sum & 0xffff);
    return chk_sum;
}


ssize_t __write_all(int fd, const void *buf, size_t count) {
    size_t total_written = 0;
    const char *ptr = buf;

    while (total_written < count) {
        ssize_t written = write(fd, ptr + total_written, count - total_written);
        if (written == -1) {
            // 处理错误（如信号中断 EINTR）
            if (errno == EINTR) continue; // 可重试的错误
            else return -1; // 其他错误直接返回
        }
        if (written == 0) break; // 某些情况下可能返回 0（如非阻塞模式）
        total_written += written;
    }
    return total_written;
}

/**
 * 从文件描述符中读取全部指定字节（或直到错误/EOF）
 * @param fd    文件描述符（如套接字、普通文件）
 * @param buf   目标缓冲区
 * @param nbytes 要求读取的字节数
 * @return      成功读取的总字节数（可能小于nbytes，若遇到EOF），出错返回-1
 */
ssize_t __read_all(int fd, void *buf, size_t nbytes) {
    size_t total_read = 0;     // 累计已读取字节
    char *ptr = buf;           // 当前缓冲区指针
    ssize_t n;                 // 单次read的返回值

    while (total_read < nbytes) {
        n = read(fd, ptr + total_read, nbytes - total_read);
        if (n == -1) {
            // 处理可恢复错误（如信号中断）
            if (errno == EINTR) continue;
            else return -1;
        } else if (n == 0) {
            // EOF（已无数据可读）
            break;
        }
        total_read += n;
    }
    return total_read;  // 可能等于nbytes（成功）或小于nbytes（遇到EOF）
}

//test
// void hello(){

// };
// int main(){
//     uint16_t chk_sum = checksum(hello);
//     printf("%d\n",chk_sum);
//     printf("%d\n", verify_checksum(hello,chk_sum));

// }